/**
 * 小程序相关权限
 * @param {String} scopeValue - 权限种类，isMessage为订阅消息设置,默认false
 *
 */

const TIPS_MAP = {
  userInfo: '用户信息',
  userLocation: '地理位置', // 需要在manifest中配置permission。
  address: '通信地址',
  userLocationBackground: '后台定位',
  record: '录音功能',
  writePhotosAlbum: '添加到相册',
  camera: '摄像头',
  invoice: '获取发票',
  invoiceTitle: '发票抬头',
  werun: '微信步数',
  message: '订阅消息',
}

export default class MpAuth {
  scopeValue
  isMessage
  constructor(scopeValue?: any) {
    this.scopeValue = scopeValue
    this.isMessage = scopeValue === 'message'
  }

  // 检测当前请求权限是否可用。
  checkAuth() {
    // eslint-disable-next-line @typescript-eslint/no-this-alias
    const that = this
    return new Promise((resolve, reject) => {
      uni.getSetting({
        withSubscriptions: that.isMessage, // 是否获取用户订阅消息的订阅状态
        success: (res) => {
          if (!that.isMessage) {
            // 非订阅消息
            if (!res.authSetting[`scope.${this.scopeValue}`]) {
              // 用户未请求过此权限，后者用户拒绝了此权限
              uni.authorize({
                // 如果没请求过，会弹窗询问。同意过，直接success。此前拒绝，直接fai
                scope: `scope.${this.scopeValue}`,
                success: (res) => {
                  // 用户同意
                  console.log(
                    `%c用户同意${TIPS_MAP[this.scopeValue]}权限1`,
                    'color:green;background:yellow',
                  )
                  resolve(1)
                },
                fail: (_err) => {
                  // 用户拒绝
                  console.log(
                    `%c用户拒绝${TIPS_MAP[this.scopeValue]}权限`,
                    'color:green;background:yellow',
                  )
                  resolve(0)
                  that.setAuth()
                },
              })
            } else {
              // 用户同意授权此权限，直接调用接口
              console.log(
                `%c用户同意${TIPS_MAP[this.scopeValue]}权限2`,
                'color:green;background:yellow',
              )
              resolve(1)
            }
          } else {
            // 订阅消息 TODO
          }
        },
        fail: (err) => {
          console.log(`%cuni.getSetting失败：`, 'color:green;background:yellow')
          console.log(err)
        },
      })
    })
  }

  // 引导用户开启权限
  setAuth() {
    uni.showModal({
      title: '设置权限',
      content: `当前功能需要${TIPS_MAP[this.scopeValue]}权限，是否开启？`,
      confirmText: '立即授权',
      success: (res) => {
        res.confirm && uni.openSetting()
      },
      fail: (_err) => {
        console.log(`%cuni.showModal失败：`, 'color:green;background:yellow')
      },
    })
  }
}
